package com.earl.eatbao.commons.service;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import com.earl.eatbao.commons.dao.BaseRepsitoty;
import org.springframework.data.domain.PageRequest;
import org.springframework.transaction.annotation.Transactional;

import com.earl.eatbao.commons.domain.AbstractEntity;

@Transactional
public abstract class BaseServiceImpl<T extends AbstractEntity<?>, ID extends Serializable>
		implements BaseService<T, ID> {

	protected abstract BaseRepsitoty<T,ID> getDao();

	protected Class<T> entityClazz;

	protected Class<ID> criteriaClazz;

	@SuppressWarnings("unchecked")
	public BaseServiceImpl() {
		Type genType = getClass().getGenericSuperclass();
		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
		entityClazz = (Class<T>) params[0];
		criteriaClazz = (Class<ID>) params[1];
	}


	@Override
	public T save(T entity) {
		// TODO 未测试.
		return getDao().save(entity);
	}

	@Override
	public List<T> update(List<T> entities) {
		// TODO 未测试.
		return null;
	}

//	@Override
//	public List<T> search(E criteria) {
//		// TODO 未测试.
//		return null;
//	}

//	@Override
//	public List<T> searchAccurate(T queryObject){
//		return getDao().searchAccurate(queryObject);
//	}
//
//	@Override
//	public List<T> searchAccurate(T object, int start, int size) {
//		// TODO 未测试.
//		List<T> objectList =  getDao().pageSearchAccurate(object,start,size);
//		return objectList;
//	}

	@Override
	public Iterable<T> findAll() {
		// TODO 未测试.
		return getDao().findByIsDeleteFalse();
	}

	public Iterable<T> findAll(int start,int size){
		return getDao().findByIsDeleteFalse(new PageRequest(start-1,size));
	}

	/**
	 * 逻辑删除实体
	 */
	@Override
	public void delete(T entity) {
		// TODO 未测试.
		entity.setDelete(true);
		getDao().save(entity);
//		getDao().delete(entity);
	}

	/**
	 * 进行逻辑删除
	 */
	@Override
	public void delete(ID id) {
		// TODO 未测试.
		T findOne = getDao().findOne(id);
		findOne.setDelete(true);
		getDao().save(findOne);
//		getDao().delete(id);
	}

	@Override
	public long count() {
		// TODO 未测试.
		return getDao().count();

	}

	@Override
	public T findOne(ID id) {
		// TODO 未测试.
		return getDao().findUniqueByIdAndIsDeleteFalse(id);
//		return getDao().findOne(id);
	}

	@Override
	public boolean exists(ID id) {
		return getDao().exists(id);
	}

	@Override
	public void deleteAll() {
		getDao().deleteAll();
	}

//	@Override
//	public List<T> searchSimilarity(T queryObject) {
//		// TODO 未测试.
//		return getDao().searchSimilarity(queryObject);
//	}
//
//	@Override
//	public List<T> searchSimilarity(T queryObject, int start, int size) {
//		// TODO 未测试.
//		return getDao().searchSimilarity(queryObject, start, size);
//	}
//
//	@Override
//	public List<T> searchQuery(ID userQuery) {
//		// TODO 未测试.
//		return getDao().searchQuery(userQuery);
//	}
}
